// https://blog.csdn.net/rxbook/article/details/130646031
package main

import (
	"fmt"
	"reflect"
)

// 自定义一个结构体 T
type T struct{}

func (t T) M1()  {} //实现自Interface接口,基类是T
func (t T) M2()  {}
func (t *T) M3() {} //实现自Interface接口,基类是*T
func (t *T) M4() {}

// 输出方法集合
func dumpMethodSet(i interface{}) {
	dynamicType := reflect.TypeOf(i)
	if dynamicType == nil {
		fmt.Printf("没有动态类型 \n")
		return
	}

	n := dynamicType.NumMethod()
	if n == 0 {
		fmt.Printf("%s 的方法集合为空\n", dynamicType)
		return
	}
	fmt.Printf("%s 的方法集合: ", dynamicType)
	for j := 0; j < n; j++ {
		fmt.Print(dynamicType.Method(j).Name, ", ")
	}
	fmt.Printf("\n")
}

func main() {
	/* 集合方法 */
	// Go 原生类型的 int、*int 由于没有定义方法，所以它们的方法集合都是空的
	var n int
	dumpMethodSet(n)  //int 的方法集合为空
	dumpMethodSet(&n) //*int 的方法集合为空

	// 自定义类型 T 定义了方法 M1 和 M2，因此它的方法集合包含了 M1 和 M2
	// *T 的方法集合中除了包含 M3 和 M4，也包含了类型 T 的方法 M1 和 M2
	var t1 T
	dumpMethodSet(t1)  //main.T 的方法集合: M1, M2,
	dumpMethodSet(&t1) //*main.T 的方法集合: M1, M2, M3, M4,

}
